//Timer0.c
#include <regx52.h>
#include <intrins.h>

////用定时器0（TMOD低四位）的模式1
//void Timer0_Init(){
//	TMOD = 0x01;	//设置中断模式为1,16位计数（定时器0模式寄存器）
//	//TMOD=TMOD&0xF0;	//将低四位清零，高四位保持不变
//	
//	TF0 = 0;		//TCON中断控制寄存器（可位寻址） TF等于1产生中断
//	TR0=1;
//	//0-65535溢出中断（定时寄存器）
//	TH0 = 64535/256;	//高位
//	TL0 = 64535%256+1;	//低位
//	//配置中断系统(中断寄存器)
//	ET0=1;	//允许定时器0中断
//	EA=1;		//总终端打开
//	PT0=0;	//低优先级
//}


/**
  * @brief  定时器0初始化,模式1，1ms,@11.0592MHz
  * @param  无
  * @retval 无
  */
void Timer0_Init(void)		//1毫秒@11.0592MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x66;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时

	EA = 1;
	ET0 = 1;
}


//外部中断初始化
void External_Interrupt0_Init(void) {
    Timer0_Init();
    IT0 = 1;  // 设置为下降沿触发
    EX0 = 1;  // 启用外部中断
}


//定时器中断函数模板
// void Timer_0_hander() interrupt 1 {
//     static unsigned int count = 0;

//     // 重载定时器初值
//     TL0 = 0x66;
//     TH0 = 0xFC;

//     // 清除TF0标志位
//     TF0 = 0;

//     // 增加计数器
//     if (++count == 1000) {
//         count = 0;
// 		     number++;
//     }
// }



// 外部中断中断处理函数 P32
// void External_Interrupt0_ISR(void) interrupt 0 {
    

// }




/************************************红外线数据接收计时********************************************************/




/**
  * @brief  定时器0初始化，用于红外线数据下降沿之间的时间计时
  * @param  无
  * @retval 无
  */

void Timer0_Init_IR(void)
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0;		//设置定时初值
	TH0 = 0;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 0;		//定时器0不计时
}

/**
  * @brief  定时器0设置计数器值
  * @param  Value，要设置的计数器值，范围：0~65535
  * @retval 无
  */
void Timer0_SetCounter(unsigned int Value)
{
	TH0=Value/256;
	TL0=Value%256;
}


/**
  * @brief  定时器0获取计数器值
  * @param  无
  * @retval 计数器值，范围：0~65535
  */
unsigned int Timer0_GetCounter(void)
{
	return (TH0<<8)|TL0;
}


/**
  * @brief  定时器0启动停止控制
  * @param  Flag 启动停止标志，1为启动，0为停止
  * @retval 无
  */
void Timer0_Run(unsigned char Flag)
{
	TR0=Flag;
}


